// 日志宏和全局接口（代理模式）

#ifndef _M_SNOWDRAGON_H__
#define _M_SNOWDRAGON_H__

#include "logger.hpp"

namespace snowdragon
{
    // 获取默认日志器
    Logger::ptr getDefaultLogger()      
    {
        return LoggerManager::getInstance().getDefaultLogger();
    }
    
    // 获取指定日志器
    Logger::ptr getLogger(const std::string &logger_name)
    {
        return LoggerManager::getInstance().getLogger(logger_name);
    }

    // 控制源码文件名和行号的输出，简化使用操作
    #define debug(fmt, ...) debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
    #define info(fmt, ...) info(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
    #define warn(fmt, ...) warn(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
    #define error(fmt, ...) error(__FILE__, __LINE__, fmt, ##__VA_ARGS__);
    #define fatal(fmt, ...) fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__);

    // getDefaultLogger前需要加snowdragon::, 参数需要加##__VA_ARGS__, 而上方的宏则不需要加snowdragon::
    // debug之类的部分会替换为上方的debug之类的部分，然后相当于通过logger，调用上方debug之类的部分。即加入了文件名和行号这些默认加入的
    #define DEBUG_LOG(logger, fmt, ...) (logger)->debug(fmt, ##__VA_ARGS__);
    #define INFO_LOG(logger, fmt, ...) (logger)->info(fmt, ##__VA_ARGS__);
    #define WARN_LOG(logger, fmt, ...) (logger)->warn(fmt, ##__VA_ARGS__);
    #define ERROR_LOG(logger, fmt, ...) (logger)->error(fmt, ##__VA_ARGS__);
    #define FATAL_LOG(logger, fmt, ...) (logger)->fatal(fmt, ##__VA_ARGS__);

    // 仅需标准输出时，可以直接使用。使用的时默认日志器，即名为root的日志器，它也是主日志器
    //  获取默认的日志器，然后传给上方对应的宏进行操作
    #define DEBUG_LOG_DEFAULT(fmt, ...) DEBUG_LOG(snowdragon::getDefaultLogger(), fmt, ##__VA_ARGS__);
    #define INFO_LOG_DEFAULT(fmt, ...) INFO_LOG(snowdragon::getDefaultLogger(), fmt, ##__VA_ARGS__);
    #define WARN_LOG_DEFAULT(fmt, ...) WARN_LOG(snowdragon::getDefaultLogger(), fmt, ##__VA_ARGS__);
    #define ERROR_LOG_DEFAULT(fmt, ...) ERROR_LOG(snowdragon::getDefaultLogger(), fmt, ##__VA_ARGS__);
    #define FATAL_LOG_DEFAULT(fmt, ...) FATAL_LOG(snowdragon::getDefaultLogger(), fmt, ##__VA_ARGS__);
}

#endif